//
//  TaskQueue.hpp
//  ThreadPool
//
//  Copyright © 2022 sinosun. All rights reserved.
//

#ifndef TaskQueue_hpp
#define TaskQueue_hpp

#include <stdio.h>
#include <queue>
#include <pthread.h>

// 定义任务结构体
using callback = void(*)(void*);

struct Task
{
    callback function;
    void* arg;
    
    
    Task()
    {
        function = nullptr;
        arg = nullptr;
    }
    
    Task(callback fun, void* arg)
    {
        function = fun;
        this->arg = arg;
    }
    
};

// 任务队列
class TaskQueue
{
public:
    TaskQueue();
    ~TaskQueue();
    
public:
    // 添加任务
    void addTask(Task& task);
    void addTask(callback func, void* arg);
    
    // 取出一个任务
    Task takeTask();
    
    // 获取当前任务队列中的任务个数
    inline int taskNumber()
    {
        return m_queue.size();
    }
    
private:
    std::queue<Task> m_queue; // 任务队列
    pthread_mutex_t m_mutex;  // 互斥锁
};


#endif /* TaskQueue_hpp */
